
/**
 * 以下的例子运行环境是在js，而不是node中
 */


/* ==============面试题1=================*/
// 考到this的指向
var length = 100
function fn1() {
    console.log(this.length)
}
fn1()

let obj = {
    length: 10,
    fn2: function (fn1) {
        fn1() // 100
        arguments[0]() // 2
    }
}
obj.fn2(fn1,'我是测试的')

// 分析：

let tempObj1 = {
    length: 10,
    fn2: function (fn1) {
        fn1() // 100, 无调用者，this默认是Windows，所以会得到全局的length = 100的值
    // arguments是参数集合，类数组，arguments[0]代表的fn1里面的this是指向参数集合，
        arguments[0]() // 2, // 相当于 console.log(arguments.length)
        console.log('arguments.length===',arguments.length)
    }
}
tempObj1.fn2(fn1,2)

/* ==============面试题2=================*/

// 考到变量提升和this的指向
var interA1 = 10
function InterProble2 () {
    interA = 100
    console.log('前interA1==',interA1) // 100，变量提升，得到的是局部变量
    console.log('this.interA1==',this.interA1) // 10，因为无调用者，this默认指向Windows，所以得到的是全局变量 a = 10
    var interA1
    console.log('后interA==',interA1) // 100，变量提升，得到的是局部变量
}
InterProble2()

/* ==============面试题3=================*/
var interA2 = 10
function InterProble3() {
    var b = interA2 * 2 // interA2变量提升，但还没有赋值，undefined做乘法运算时，得到NaN
    var interA2 = 20
    var c = interA2 + 1 // 局部变量interA2已经被赋值为20,20 + 1得到21的结果
    console.log('b==',b)
    console.log('c==',c)
}
InterProble3()